객체 그래프

객체와 객체 사이의 참조 관계를 나타내는 구조
객체는 노드, 참조는 엣지로 표현할 수 있다

루트 세트(Root Set)

객체 그래프 순회의 시작점
주로 스택의 지역 변수, 정적 변수, 스레드 스택을 포함한다

순회 과정

  1. 루트 세트에서 시작한다
  2. 각 객체의 참조를 따라 연결된 모든 객체를 방문한다
  3. 방문한 객체는 방문 처리한다

예시

public class ObjectGraphExample {
    public static void main(String[] args) {
        Person person1 = new Person("Alice");
        Person person2 = new Person("Bob");
        
        person1.setFriend(person2);
        person2.setFriend(person1);
        
        person1 = null;  // person1에 대한 직접 참조 제거
    }
}

class Person {
    private String name;
    private Person friend;
    
    public Person(String name) {
        this.name = name;
    }
    
    public void setFriend(Person friend) {
        this.friend = friend;
    }
}
초기 상태
  1. main 메소드의 지역 변수 person1과 person2가 루트 세트이다
  2. person1은 객체 Alice를 참조하고, person2는 객체 Bob을 참조한다
  3. Alice와 Bob은 서로를 참조한다
  4. person1 = null 이후 더 이상 Alice를 직접 참조하지 않게 된다
가비지 컬렉터의 순회
  1. 루트 세트 person2에서 시작한다
  2. person2에서 Bob 객체로 이동한다
  3. Bob 객체에서 Alice 객체로 이동한다
  4. 모든 객체가 여전히 도달 가능하므로 가비지 컬렉션 대상이 없다